package com.zh.common.util;

import com.zh.common.entity.GeneratorEntity;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;


/**
 * code is far away from bug with the animal protecting
 * ┏┓　　　┏┓
 * ┏┛┻━━━┛┻┓
 * ┃　　　　　　　┃
 * ┃　　　━　　　┃
 * ┃　┳┛　┗┳　┃
 * ┃　　　　　　　┃
 * ┃　　　┻　　　┃
 * ┃　　　　　　　┃
 * ┗━┓　　　┏━┛
 * 　　┃　　　┃神兽保佑
 * 　　┃　　　┃代码无BUG！
 * 　　┃　　　┗━━━┓
 * 　　┃　　　　　　　┣┓
 * 　　┃　　　　　　　┏┛
 * 　　┗┓┓┏━┳┓┏┛
 * 　　　┃┫┫　┃┫┫
 * 　　　┗┻┛　┗┻┛
 *
 * @Description: 模板生成工具类
 * @Author: Li.HuiNeng
 * @Create in: 2019/8/17
 * @Version: 1.0.1
 */
public class GeneratorUtil {

    public static void AutoGenerator(GeneratorEntity gen) throws IOException {
        // 模板目录
        // "F:/zh-cloud-elec/zh-cloud-manage-service/src/main/resources/template";
        String templateDirectory = gen.getTemplateDirectory();
        // 模板名称
        String templateFile = gen.getTemplateFile() + ".java.vm";
        // 模板生成后存放目录
        String targetPath = gen.getTargetUrl() + gen.getTargetPath();
        // 模板生成后新文件名
        String fileName = gen.getFileName() + ".java";
        gen.setDateName(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
        // 创建文件夹
        new File(targetPath).mkdirs();
        File nFile = new File(targetPath + "/" + fileName);
        if (nFile.exists()) {
            throw new RuntimeException("File \'" + fileName + "\' already exists");
        }
        // 生成目标文件
        Writer writer = null;
        try {
            writer = new FileWriter(nFile);
            Template template = getConfiguration(templateDirectory).getTemplate(templateFile, "UTF-8");
            template.process(gen, writer);
        } catch (TemplateException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            writer.close();
        }
    }

    private static Configuration getConfiguration(String templateDirectory) {

        Configuration configuration = new Configuration(Configuration.VERSION_2_3_22);
        try {
            configuration.setTagSyntax(Configuration.AUTO_DETECT_TAG_SYNTAX);
            configuration.setDirectoryForTemplateLoading(new File(templateDirectory));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        return configuration;
    }
}
